#+title: GNU Emacs I: Uso básico y configuración inicial
#+author: dlmayhem
#+email: dlmayhem@riseup.net
#+date: 2023-11-28
#+language: es
#+options: num:nil toc:nil ':t

* ¡Bienvenidos!

En este curso introductorio revisaremos algunas de las funciones del poderoso editor de textos GNU Emacs, partiendo de su uso más básico hasta configuraciones avanzadas, orientadas a la productividad en entornos académicos.

- Material del curso :: https://notabug.org/dlmayhem/emacs-hss.git
- Mi config personal :: https://notabug.org/dlmayhem/terror-emacs.git
  
* Contenidos

- ¿Qué es Emacs?
- Los elementos de la pantalla
- Uso básico
- Configuración inicial

* Un poco de historia

- Uno de los míticos contendores en la famosa /Guerra de editores/.
- Primer lanzamiento en 1976.
- Escrito en *C* y *Lisp* por RMS y Guy Steele.
- Software libre bajo *GPLv3*.

* Características principales

- *Editor de texto*
  + Avanzado :: Puede hacer mucho más que escribir y borrar texto.
  + Autodocumentado :: Incluye un manual y un tutorial, así como comandos de ayuda específicos.
  + Personalizable :: Podemos modificar el comportamiento a nuestro antojo.
  + Extensible :: Podemos crear extensiones para, probablemente, *cualquier cosa* que queramos hacer con un computador.

* ¿Qué es realmente Emacs?

- Intérprete de Emacs Lisp, un dialecto del lenguaje Lisp.
- Lo más cercano a las antiguas /máquinas Lisp/.
- Puede correr pequeños programas específicos para todo tipo de tareas, lo que lo convierte casi en un sistema operativo por si mismo.

* ¿Para qué sirve?

- Editor de texto
- Entorno de desarrollo integrado (IDE)
  + Resaltado de sintaxis
  + Autoindentación
  + Autocompletado
- Gestor de archivos
- Navegador web
- Lector de correos/noticias
- Chat, RRSS, juegos, terapia
- Gestor de ventanas
  
* Ventajas

- Libre :: Se puede usar con cualquier propósito, estudiar, modificar y compartir.
- Multiplataforma :: Disponible para la mayoría de los sistemas operativos que existen.
- Soporte Unicode :: Soporte para prácticamente cualquier forma de escritura humana.
- ELPA/MELPA :: Incluye un gestor de paquetes que facilita la instalación de nuevas características.
- Productividad :: Al funcionar exactamente de la forma que uno quiere, facilita el trabajo en cualquier área.
  
[[./xkcd.png]]

* Desventajas

- Curva de aprendizaje :: No funciona como los editores comunes. Hay que aprender una nueva forma de trabajar, junto con varios comandos.
- Poco intuitivo :: La primera vez que abrimos Emacs probablemente no sabremos que hacer.
- Dificultad de tecleo :: Hay atajos de teclado que no son muy cómodos de ejecutar.
- Personalización :: *NUNCA* se termina de configurar completamente.

[[./curves.png]]

* ¿Cómo lo obtengo?

- Sistemas basados en Debian ::
    =apt install emacs=

- Sistemas basados en Arch ::
    =pacman -S emacs=

- GNU Guix ::
    =guix install emacs=

* Partes del editor

- Barra de menú :: El clásico menú de cualquier programa moderno que muestra distintas acciones.
- Barra de herramientas :: Lo mismo, pero con botones e íconos.
- Ventana o área de edición :: Parte de la pantalla en la que se muestra el contenido de un buffer.
- Buffer :: Archivo o directorio abierto dentro de Emacs. 
- Línea de modo :: Barra inferior, en la que se muestra información útil, como el título del buffer, los modos activos, la posición, etc.
- Minibuffer :: Barra bajo la línea de modo en la que ingresamos información cuando Emacs la requiere.
- Área de eco :: La misma barra bajo la línea de modo, pero nos muestra información relevante.

* ¿Cómo se usa?

- Si ya somos usuarios de Emacs, respaldemos nuestra configuración previa para empezar desde cero:

    =mv .emacs.d resp-emacs-d=

- Toda acción en Emacs es un comando.
- Casi todos los comandos son una función escrita en Elisp.
- Para ingresar un comando, debemos indicárselo a Emacs con la combinación =M-x=.
- Los comandos más comunes suelen tener por defecto algún atajo de teclado asociado.
  
** Simbología

| SÍMBOLO | TECLA      |
|---------+------------|
| C       | Control    |
| M       | Meta (Alt) |
| C-x     | Ctrl + x   |
| M-x     | Alt + x    |

* Manejar archivos

| ATAJO   | ACCIÓN              | COMANDO                    |
|---------+---------------------+----------------------------|
| C-x C-f | Crear/abrir archivo | find-file                  |
| C-x C-s | Guardar archivo     | save-buffer                |
| C-x C-w | Guardar como        | write-file                 |
| C-x C-c | Cerrar Emacs        | save-buffers-kill-terminal |

* Ventanas y buffers

** Ventanas

| ATAJO   | ACCIÓN                           | COMANDO                |
|---------+----------------------------------+------------------------|
| C-x 2   | Abrir nueva ventana horizontal   | split-window-below     |
| C-x 3   | Abrir nueva ventana vertical     | split-window-right     |
| C-x 0   | Cerrar ventana actual            | delete-window          |
| C-x 1   | Cerrar todo menos ventana actual | delete-other-windows   |
| C-x 4 0 | Cerrar buffer y ventana actual   | kill-buffer-and-window |
| C-x o   | Saltar a la ventana siguiente    | other-window           |

** Buffers

| ATAJO   | ACCIÓN                        | COMANDO          |
|---------+-------------------------------+------------------|
| C-x C-f | Abrir archivo en nuevo buffer | find-file        |
| C-x b   | Cambiar a otro buffer         | switch-to-buffer |
| C-x k   | Cerrar buffer                 | kill-buffer      |


* Manipular texto

** Movimiento a través del texto

| ATAJO    | ACCIÓN                | COMANDO            |
|----------+-----------------------+--------------------|
| C-b      | Retrocede un caracter | backward-char      |
| C-f      | Avanza un caracter    | forward-char       |
| M-b      | Retrocede una palabra | backward-word      |
| M-f      | Avanza una palabra    | forward-word       |
| C-a      | Inicio de línea       | begining-of-line   |
| C-e      | Final de la línea     | end-of-line        |
| M-a      | Inicio de la oración  | backward-sentence  |
| M-e      | Final de la oración   | forward sentence   |
| C-<up>   | Párrafo anterior      | backward-paragraph |
| C-<down> | Párrafo siguiente     | forward-paragraph  |

** Cortar/copiar/pegar

| ATAJO | ACCIÓN                        | COMANDO          |
|-------+-------------------------------+------------------|
| C-SPC | Establecer marca              | set-mark-command |
| C-w   | "Cortar"                      | kill-region      |
| M-w   | "Copiar"                      | kill-ring-save   |
| C-y   | "Pegar"                       | yank             |
| C-g   | Cancelar combinación en curso | keyboard-quit    |
| C-x u | Deshacer                      | undo             |

* Configuración inicial

** Ocultar elementos

#+begin_src elisp

  (menu-bar-mode -1) ;; Oculta la barra del menú
  (scroll-bar-mode -1) ;; Oculta la barra de desplazamiento
  (tool-bar-mode -1) ;; Oculta la barra de herramientas
  (delete-selection-mode 1) ;; Borra la región seleccionada
  (column-number-mode) ;; Número de la columna en la línea de modo  

#+end_src

** Algunos detalles

#+begin_src elisp

  ;; Configurar nuestra fuente preferida
  (set-face-font 'default "JetBrainsMono 12")
  (set-face-font 'variable-pitch "JetBrainsMono 12")

  (setq default-fill-column 100
        make-backup-files nil
        inhibit-startup-message t
        custom-file "~/.emacs.d/custom.el")
  (load custom-file)

#+end_src

** Gestor de paquetes

#+begin_src elisp

  (require 'package)
  (setq package-archives '(("melpa" . "https://melpa.org/packages/")
                           ("nongnu" . "https://elpa.nongnu.org/nongnu/")
                           ("elpa" . "https://elpa.gnu.org/packages/")))
  (package-initialize)
  (unless package-archive-contents
    (package-refresh-contents))

#+end_src

** use-package

#+begin_src elisp

  (unless (package-installed-p 'use-package)
    (package-install 'use-package))
  (require 'use-package)
  (setq use-package-always-ensure t)

#+end_src

** Vertico

#+begin_src elisp

  (use-package vertico
    :ensure t
    :init
    (vertico-mode))

  (use-package vertico-directory
    :after vertico
    :ensure nil
    :bind (:map vertico-map
                ("RET" . vertico-directory-enter)
                ("DEL" . vertico-directory-delete-char)
                ("M-DEL" . vertico-directory-delete-word))
    :hook (rfn-eshadow-update-overlay . vertico-directory-tidy))

  (use-package savehist
    :init
    (savehist-mode))
  
#+end_src

** Marginalia

#+begin_src elisp

  (use-package marginalia
    :after vertico
    :ensure t
    :init
    (marginalia-mode)
    :custom
    (marginalia-align 'right))

#+end_src

** Orderless

#+begin_src elisp

  (use-package orderless
    :ensure t
    :after vertico
    :custom
    (completion-styles '(orderless basic)))

#+end_src

** which-key

#+begin_src elisp

  (use-package which-key
    :defer 0
    :config
    (which-key-mode)
    (setq which-key-idle-delay 0.3))
  
#+end_src

** Modus Themes

#+begin_src elisp

  (use-package modus-themes
    :if window-system
    :init
    (load-theme 'modus-vivendi t))

#+end_src

** Smartparens

#+begin_src elisp

  (use-package smartparens
    :hook (prog-mode . smartparens-mode))

#+end_src

** Dired

#+begin_src elisp

  (use-package dired
    :ensure nil
    :defer 1
    :config
    (setq dired-recursive-copies 'always
          dired-listing-switches "--group-directories-first -alh"))

  (use-package dired-hide-dotfiles
    :after dired
    :hook (dired-mode . dired-hide-dotfiles-mode)
    :config
    (define-key dired-mode-map "." #'dired-hide-dotfiles-mode))
  
#+end_src

* Recursos

** Lectura recomendada

- (2023) Richard Stallman et al., /[[https://www.gnu.org/software/emacs/manual/pdf/emacs.pdf][GNU Emacs Manual]]/.
- (2023) Proyecto GNU, /[[https://www.gnu.org/software/emacs/refcards/][GNU Emacs Reference Card]]/.
- (2004) Joaquín Ataz López, /[[http://es.tldp.org/Tutoriales/doc-tutorial-emacs/intro_emacs.pdf][Una introducción rápida a GNU Emacs]]/.

** Canales de YouTube

- [[https://yewtu.be/channel/UCAiiOTio8Yu69c3XnR7nQBQ][System Crafters]]
- [[https://yewtu.be/channel/UC0uTPqBCFIpZxlz_Lv1tk_g][Protesilaos Stavrou]]
- [[https://yewtu.be/playlist?list=PL5--8gKSku15uYCnmxWPO17Dq6hVabAB4][DistroTube]]

* Paquetes utilizados

- [[https://github.com/minad/vertico][Vertico]]
- [[https://github.com/minad/marginalia][Marginalia]]
- [[https://github.com/oantolin/orderless][Orderless]]
- [[https://github.com/justbur/emacs-which-key][which-key]]
- [[https://protesilaos.com/emacs/modus-themes][Modus Themes]]
- [[https://github.com/Fuco1/smartparens][Smartparens]]
- [[https://github.com/mattiasb/dired-hide-dotfiles][Dired Hide Dotfiles]]

* Próxima clase

- Gestión básica de paquetes
- Modos mayores y menores
- El Modo Org

*¡Gracias por asistir!*
